/**
 *  This file is part of "c-genericlinkedlist".
 *
 *  "c-genericlinkedlist" is free software:
 *  you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  "c-genericlinkedlist" is distributed
 *  in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with "c-genericlinkedlist".
 *  If not, see <http://www.gnu.org/licenses/>
 *
 */

#ifndef LIST_H
#define LIST_H

#include <stdio.h>
#include <stdlib.h>

typedef void* tipo_lista;

typedef struct StructNo {
	tipo_lista valor;
	struct StructNo *prox, *anterior;
} No;

typedef struct {
	No *inicio, *fim;
	int size;
} Lista;


/**
 * Descricao: Cria um No
 * Retorno:   Retorna um ponteiro pro no alocado.
 * Situacao:  IMPLEMENTADA
 */
No*  criarNo();

/**
 * Descricao: Libera/Desaloca um No
 * Parametro: No 'N' a ser liberado
 * Situacao:  IMPLEMENTADA
 */
void liberarNo(No* N);

/**
 * Descricao: Cria uma lista
 * Retorno:   Retorna um ponteiro pra lista alocada.
 * Situacao:  IMPLEMENTADA
 */
Lista* criarLista();

/**
 * Descricao: Libera/Desaloca uma Lista
 * Situacao:  INCOMPLETA
 */
void   liberarLista(Lista *L);

/**
 * Descricao: Verifica se a lista esta vazia
 * Parametro: Lista L a ser verificada
 * Retorno:   1 se vazia, 0 caso contrario
 * Situacao:  IMPLEMENTADA
 */
int  taVazia(Lista *L);
void inserirInicio(Lista *L, tipo_lista dado);
void inserirFim(Lista *L, tipo_lista dado);
void inserirOrdenado(Lista *L, int(*compara)(const void*, const void*), tipo_lista dado);

/**
 * Descricao: Busca por um elemento 'elem' na lista
 * Parameto:  'L' eh a lista a ser scaneada e 'elem' eh o elemento procurado
 * Retorno:   NULL se nao encontrado ou um ponteiro pro elem se encontrado
 * Situacao:  INCOMPLETA
 */
tipo_lista buscar(Lista* L, tipo_lista elem);

/**
 * Descricao: busca por um elemento 'elem' em uma lista ORDENADA
 * OBS:       Se a lista nao estiver ordenada, o comportamento da funcao sera
 *        imprevisivel. Vide metodo inserirOrdenado
 * Parameto:  'L' eh a lista a ser scaneada e 'elem' eh o elemento procurado
 * Retorno:   NULL se nao encontrado ou um ponteiro pro elem se encontrado.
 * Situacao:  INCOMPLETA
 */
tipo_lista buscarOrdenado(Lista* L, tipo_lista elem);

void removerInicio(Lista *L);
void removerFim(Lista *L);

/**
 * Situacao: INCOMPLETA
 */
void removerElem(Lista *L, tipo_lista dado);

void printInt(Lista *L);

#endif

